/*
 * Esse arquivo é parte do Software de Segurança do LaPEC
 * 
 * Copyright (C) 2012-$AnoCorrente$ Dyego Ítallo Silva Ferreira
 * Copyright (C) 2012-$AnoCorrente$ Eduardo Moreira Barbosa
 * Copyright (C) 2012-$AnoCorrente$ João dos Santos Gonçalves
 * 
 * LaPEC é um Software Livre: Você pode redistribuí-lo e/ou modificá-lo
 * de acordo com os termos da Licença Pública Geral GNU (GNU General Public License)
 * conforme publicada pela Free Software Foundation (FSF). Essa permissão é atribuída
 * na versão 3 da Licença, ou (na sua opinião) qualquer versão.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este programa,
 * se não, escreva para a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA  02110-1301  USA
 * 
 * Se você tiver alguma dúvida e/ou quiser dar suporte ao desenvolvimento, favor entrar em
 * contato nos e-mails <dyegoitallo@gmail.com>, <barbosa.edrd@gmail.com>, <john.jsg@hotmail.com>.
 */
package dao.mysql;

import biometria.Digital;
import conexaoBiometria.ArquivoBinario;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import usuario.Usuario;

/**
 * Classe responsável pelas operações de consultas e inserir dados na tabela 
 * de biometria do banco do projeto.
 * @author João dos Santos Gonçalves
 */
public class BancoBiometria extends Operacoes{
    // ===============================================================================
    // Atributos
    // ===============================================================================    
    private String sql;
    private ArquivoBinario arquivoBinario = new ArquivoBinario();

    
    // ===============================================================================
    // Métodos
    // ===============================================================================        
    /**
     * Método salvará no banco o binário localizado na pasta relativa "temp" do
     * projeto.
     *
     * @param matricula é a matricula do usuário cadastrado.
     * @param digital é a número da digital a ser salva.
     */
    public void cadastrarBiometria(Usuario novoUsuario) {

        sql = "INSERT INTO lapec_biometria.biometria"
                + "(usuario_matricula, digital, biometria)"
                + "VALUES (?, ?, ?);";

        // Variavel temporária
        Digital[] digitais = novoUsuario.getDigitais();
        
        for (Digital digital : digitais) {

            if (digital != null) {
                try {
                    BancoDeDadosMySQL.PREPAREDSTATEMENT = BancoDeDadosMySQL.CONNECTION.prepareStatement(sql);
                    arquivoBinario.carregarArquivoBinario(novoUsuario.getMatricula(), digital.getNumDedo());
                    try {
                        BancoDeDadosMySQL.PREPAREDSTATEMENT.setString(1, novoUsuario.getMatricula());
                        BancoDeDadosMySQL.PREPAREDSTATEMENT.setInt(2, digital.getNumDedo());
                        BancoDeDadosMySQL.PREPAREDSTATEMENT.setBinaryStream(3, digital.getDedo(),
                                arquivoBinario.getLengthFile());
                        BancoDeDadosMySQL.PREPAREDSTATEMENT.executeUpdate();
                        BancoDeDadosMySQL.PREPAREDSTATEMENT.close();

                        // Fechamento do arquivo de entrada
                        try {
                            digital.getDedo().close();

                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }

                    } catch (SQLException sQLException) {
                        sQLException.printStackTrace();
                    }
                } catch (SQLException sQLException) {
                    sQLException.printStackTrace();
                }                
            }
        }
    }

    /**
     * Exportação do arquivo binário da digital do bando de dados para arquivo
     * local. Temporariamente só está funcionando p o ultimo arquivo encontrado
     * no respositório, em breve vou encontrar uma solução p/ isso.
     */
    public void exportarBiometrias() {

        sql = "SELECT usuario_matricula, digital, biometria "
                + "FROM lapec_biometria.biometria;";

        try {
            BancoDeDadosMySQL.STATEMENT = BancoDeDadosMySQL.CONNECTION.createStatement();
            BancoDeDadosMySQL.RESULTSET = BancoDeDadosMySQL.STATEMENT.executeQuery(sql);

            try {
                while (BancoDeDadosMySQL.RESULTSET.next()) {

                    // Variaveis temporárias
                    InputStream binario = BancoDeDadosMySQL.RESULTSET.getBlob("biometria").getBinaryStream();
                    int digital = BancoDeDadosMySQL.RESULTSET.getInt("digital");
                    String matricula = BancoDeDadosMySQL.RESULTSET.getString("usuario_matricula");

                    arquivoBinario.gravarBinarioEmDisco(matricula, digital, binario);
                }
            } catch (SQLException sQLException) {
                sQLException.printStackTrace();
            }

        } catch (SQLException sQLException) {
            sQLException.printStackTrace();
        }
    }

    /**
     * Método para que atualiza a biometria de um usuário no bando de dados.
     * 
     * @param user é o usuário que terá a a biometria mudada.
     * @param digital é tem a nova biometria e a de qual dedo ela pertence.
     */
    public void atualizarBiometria(Usuario user, Digital digital) {
        
        sql = "UPDATE lapec_biometria.biometria SET biometria = ? WHERE usuario_matricula = ? AND digital = ?;";
        
        try{
           BancoDeDadosMySQL.PREPAREDSTATEMENT = BancoDeDadosMySQL.CONNECTION.prepareStatement(sql);
           BancoDeDadosMySQL.PREPAREDSTATEMENT.setBinaryStream(1, digital.getDedo());
           BancoDeDadosMySQL.PREPAREDSTATEMENT.setString(2, user.getMatricula());
           BancoDeDadosMySQL.PREPAREDSTATEMENT.setInt(3, digital.getNumDedo());

           BancoDeDadosMySQL.PREPAREDSTATEMENT.execute();
           BancoDeDadosMySQL.PREPAREDSTATEMENT.close();           
        } catch (SQLException sQLException){
            sQLException.printStackTrace();
        }
    }

    /**
     * Remove a biometria salva no banco de dados.
     * 
     * @param user é o usuário que terá a biometria cadastrada.
     * @param digital contém o dedo cuja a biometria será apagada.
     */
    public void removerBiometria(Usuario user, Digital digital) {
        
        sql = "DELETE FROM lapec_biometria.biometria WHERE usuario_matricula = ? AND digital = ?;";
        
        try{
            
            BancoDeDadosMySQL.PREPAREDSTATEMENT = BancoDeDadosMySQL.CONNECTION.prepareStatement(sql);
            BancoDeDadosMySQL.PREPAREDSTATEMENT.setString(1, user.getMatricula());
            BancoDeDadosMySQL.PREPAREDSTATEMENT.setInt(2, digital.getNumDedo());
            BancoDeDadosMySQL.PREPAREDSTATEMENT.execute();
            BancoDeDadosMySQL.PREPAREDSTATEMENT.close();
        } catch (SQLException sQLException){
            sQLException.printStackTrace();
        } 
    }
}
